#pragma once
#include <queue>
#include <mutex>
#include <condition_variable>
#include "MySqlOperation.h"
using namespace std;

//	单例模式：懒汉模式
class ConnectPool
{
public:
	//	给外部提供的接口
	static ConnectPool* get_connect_pool();
	//	删除拷贝构造函数
	ConnectPool(const ConnectPool& pool) = delete;
	//	删除等号操作符重载
	ConnectPool& operator=(const ConnectPool& pool) = delete;
	//	给外部提供数据库连接
	shared_ptr<MysqlOperation> get_connection();
	//	析构函数
	~ConnectPool();
private:
	//	初始化
	ConnectPool();

	//	添加连接
	void add_connection();

	//	创建连接管理线程的任务函数
	void produce_connection();

	//	销毁连接管理线程的任务函数
	void recycle_connection();
	
	//	解析json获取配置信息
	bool perse_json_file();

private:
	string m_ip;									//	数据库的ip地址
	string m_user;									//	用户名
	string m_passwd;								//	密码
	string m_db_name;								//	数据库名称
	unsigned short m_port;							//	端口号
	int m_max_size;									//	最大连接数
	int m_min_size;									//	最小连接数
	int m_timeout;									//	超时时间
	int m_max_idle_time;							//	最大空间时间，超过这个时间需要删除这个线程
	queue<MysqlOperation*> m_connect_q;				//	数据库的连接句柄队列
	mutex m_mx_q;									//	互斥锁
	condition_variable m_cond;						//	条件变量	由于例子简单所以一个就够了
};